package com.javaclimb.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.alibaba.fastjson.JSONObject;
import com.javaclimb.pojo.SelectTree;
import com.javaclimb.pojo.Tree;
import com.javaclimb.pojo.User;
import com.javaclimb.service.UserService;
import com.javaclimb.utils.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Slf4j
@RestController //方法返回体都是json
@RequestMapping("/consumer")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private JwtHelper jwtHelper;

    /**
     * 前端用户登录
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public Object login(User user) {  //前端有content-path请求头，json请求体都别加@RequestBody 否者报错
        JSONObject jsonObject = new JSONObject();
        String username = user.getUsername();    //姓名
        String password = user.getPassword();    //密码

        if (username == null || username.equals("")) {
            /*CODE 0代表失败，1代表成功*/
            jsonObject.put(Consts.CODE, 0);
            jsonObject.put(Consts.MSG, "用户名不能为空");
            return jsonObject;
        }
        if (password == null || password.equals("")) {
            jsonObject.put(Consts.CODE, 0);
            jsonObject.put(Consts.MSG, "密码不能为空");
            return jsonObject;
        }

        //判断用户存不存在
        User byUsername = userService.getByUsername(username);
        if (byUsername == null) {
            jsonObject.put(Consts.CODE, 0);
            jsonObject.put(Consts.MSG,"用户不存在");
            return jsonObject;
        }

        User loginUser = userService.verifyPassword(username, password);
        if (loginUser!=null) {//密码验证成功
            jsonObject.put(Consts.CODE, 1);
            jsonObject.put(Consts.MSG, "登录成功");
            jsonObject.put("userMsg", loginUser);

            //根据用户id生成token
            String token = jwtHelper.createToken(Long.valueOf(loginUser.getUserId()));
            //System.out.println(token);
            //将token封装到jsonObject中返回
            jsonObject.put("token",token);
            return jsonObject;
        }
        jsonObject.put(Consts.CODE, 0);
        jsonObject.put(Consts.MSG, "用户名或密码错误");
        return jsonObject;
    }

    /**
     * 根据token获取用户信息
     */
    @GetMapping("/getUserInfo")
    public Object getUserInfo(@RequestHeader String token, HttpServletRequest request) {
        JSONObject jsonObject=new JSONObject();
        //1.判断token是否有效 true是过期了
        boolean expiration = jwtHelper.isExpiration(token);
        //2.根据token解析出用户id
        if(expiration){
            //失效
            jsonObject.put(Consts.CODE, 0);
            jsonObject.put(Consts.MSG, "身份已过期，请重新登录");
            return jsonObject;
        }else{
            //3.根据用户id查询用户数据
            int userId = jwtHelper.getUserId(token).intValue();
            User user=userService.selectUserOfId(userId+"");
            //4.去掉密码，封装result返回
            //user.setPassword("");

            //封装
            jsonObject.put(Consts.CODE, 1);
            jsonObject.put("userMsg", user);
            return jsonObject;
        }
    }

    /**
     * 前端用户注册
     */
    @PostMapping("/register")
    public JSONObject register(HttpServletRequest request) {
        JSONObject jsonObject = new JSONObject();
        String username = request.getParameter("username").trim();
        String password = request.getParameter("password").trim();
        String code = request.getParameter("code").trim();
        String uuid = request.getParameter("uuid");
        System.out.println("register:"+uuid);

        if(username.equals("") ||username==null) {
            jsonObject.put(Consts.MSG,0);
            jsonObject.put(Consts.MSG,"用户名不能为空");
            return jsonObject;
        }else {
            User u = userService.getByUsername(username);
            if(u!=null){
                jsonObject.put(Consts.MSG,0);
                jsonObject.put(Consts.MSG,"用户名已存在");
                return jsonObject;
            }
        }

        if(password.equals("")||password==null){
            jsonObject.put(Consts.MSG,0);
            jsonObject.put(Consts.MSG,"密码不能为空");
            return jsonObject;
        }

        if(code.equals("")||code==null){
            jsonObject.put(Consts.MSG,0);
            jsonObject.put(Consts.MSG,"验证码不能为空");
            return jsonObject;
        }

        if(CaptchaUtils.verify(uuid, code)) {
            System.out.println("验证码正确");
            User user=new User();
            user.setUsername(username);
            user.setPassword(password);
            userService.inserUser(user);
            jsonObject.put(Consts.CODE,1);
            jsonObject.put(Consts.MSG,"注册成功，前往登录界面");
            return jsonObject;
        }else{
            System.out.println("验证码错误");
            jsonObject.put(Consts.MSG,"验证码错误");
            return jsonObject;
        }
    }

    /**
     * 上传头像照片
     */
    @PostMapping("/updateConsumerPic")
    public Object updateUserPic(@RequestParam("file") MultipartFile file, @RequestParam("id") String id){
        JSONObject jsonObject=new JSONObject();
        if(file.isEmpty()){
            jsonObject.put(Consts.CODE,0);
            jsonObject.put(Consts.MSG,"文件上传失败");
            return jsonObject;
        }
        //文件名=当前时间到毫秒+原来文件名
        String fileName=System.currentTimeMillis()+file.getOriginalFilename();
        String filePath=System.getProperty("user.dir")+System.getProperty("file.separator")+"avatarImg";
        //如果文件路径不存在，就新增路径
        File file1=new File(filePath);
        if(!file1.exists()){
            file1.mkdir();
        }
        //实际文件路径
        File dest=new File(filePath+System.getProperty("file.separator")+fileName);
        //存储到数据库里的相对文件地址
        String storeAvatorPath="/avatarImg/"+fileName;
        try {
            file.transferTo(dest);
            User user=new User();
            user.setUserId(Integer.valueOf(id));
            user.setAvator(storeAvatorPath);
            boolean flag = userService.update(user);
            if(flag){
                jsonObject.put(Consts.CODE,1);
                jsonObject.put(Consts.MSG,"文件上传成功");
                jsonObject.put("avator",storeAvatorPath);
                return jsonObject;
            }
            jsonObject.put(Consts.CODE,0);
            jsonObject.put(Consts.MSG,"文件上传失败");
            return jsonObject;
        } catch (IOException e) {
            //给前端一个错误信息
            jsonObject.put(Consts.CODE,0);
            jsonObject.put(Consts.MSG,"文件上传失败"+e.getMessage());
        }finally {
            return jsonObject;
        }
    }

    /**
     * 生成验证码
     */
    @RequestMapping("/captcha")
    public void getCaptcha(@RequestParam String uuid, HttpServletResponse response) throws IOException {
        CaptchaUtils.getCircleCaptcha(uuid, response);
        System.out.println("captcha:"+uuid);
    }

    /**
     * 根据用户id查询用户信息
     */
    @GetMapping("/selectByPrimaryKey")
    public Object selectUserOfId(HttpServletRequest request){
        String id = request.getParameter("id").trim();
        System.out.println(id);
        User user = userService.selectUserOfId(id);
        return user;
    }

    /**
     * 修改用户信息
     */
    @PostMapping("/update")
    public Object updateUser(HttpServletRequest request) {
        JSONObject jsonObject = new JSONObject();
        String userId = request.getParameter("id").trim();
        String username = request.getParameter("username").trim();    //姓名
        String password = request.getParameter("password").trim();    //密码
        String sex = request.getParameter("sex");    //密码

        if(username==null||username.equals("")){
            jsonObject.put(Consts.CODE, 0);
            jsonObject.put(Consts.MSG, "用户名不能为空");
            return jsonObject;
        }

        //保存到对象里面去
        User user = new User();
        user.setUserId(Integer.parseInt(userId));
        user.setUsername(username);
        user.setPassword(password);

        boolean flag = userService.update(user);
        if (flag) {//保存成功
            jsonObject.put(Consts.CODE, 1);
            jsonObject.put(Consts.MSG, "添加成功");
            return jsonObject;
        }
        jsonObject.put(Consts.CODE, 0);
        jsonObject.put(Consts.MSG, "添加失败");
        return jsonObject;
    }
    /*===========================================后台=======================================================*/

    /**
     * 获取全部用户信息
     */
    @PostMapping(value = "/selectUser")
    public Result page(@RequestBody User su){
        log.info("分页查询，参数：{}，{}，{}，{}，{},{}",su.getPage(),su.getPageSize(),su.getUserId(),su.getUsername(),su.getSex(),su.getAge());
        //调用service分页查序
        PageBean pB = userService.page(su.getPage(),su.getPageSize(),su.getUserId(),su.getUsername(),su.getSex(),su.getAge());
        return Result.success(pB);
    }

    /**
     * 删除用户
     */
    @DeleteMapping("/{ids}")//传递地址参数
    public Result delete(@PathVariable List<Integer> ids){
        log.info("批量删除操作，ids:{}",ids);
        userService.delete(ids);
        return Result.success();
    }

    /**
     * 修改用户
     */
    @PutMapping("/updateUser")
    public Result update(@RequestBody User user){
        log.info("更新用户信息：{}",user);
        userService.update(user);
        return Result.success();
    }
}
